//
//  Hand.cpp
//  Test
//
//  Created by Pedram Ardeshirzadeh on 20-07-12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#include <stdexcept>

#include "Hand.h"

Hand::Hand() {
    cout << "Hand created" << endl;
}

void Hand::addCard(Card *c) {
    assert(c != NULL);
    cards.push_back(c);
}

/*void Hand::addCard(Card c) {
    
    cards.push_back(c);
}*/

void Hand::removeCard(Card *c) {
    assert(c != NULL);
    list<Card*>::iterator card=find(c);
    if(card!=NULL){
        cards.erase(card);
    }
}
list<Card*>::iterator Hand::find(Card *c){
    for(list<Card*>::iterator it=cards.begin();it!=cards.end();it++){
        if((*(*it))==*c){
            return it;
        }
    }
    return NULL;
}
void Hand::removeCard(int n){
    assert(n>=0);
    if(n>=cards.size()){
        throw std::out_of_range ("The selected position is out of range!");
    }
    list<Card*>::iterator it=cards.begin();
    for(int i=0;it!=cards.end()&&i<n;it++,i++);
    cards.erase(it);
}

Card* Hand::getCard(int n){
    assert(n>=0);
    if(n>=cards.size()){
        throw std::out_of_range ("The selected position is out of range!");
    }
    list<Card*>::iterator it=cards.begin();
    for(int i=0;it!=cards.end()&&i<n;it++,i++);
    return *it;
}

int Hand::size(){
    return cards.size();
}

Hand::~Hand(){
    // De reden waarom ik dit heb uitgecommet is dat wanneer je ergens in je code
    // Card * card = new Card(); Hand* hand=new Hand();hand->addCard(card);delete hand;
    // Dan verwijst card naar NULL;
    // Dat kan voor problemen zorgen wanneer je dezelfde kaart in twee verschillende handen gebruikt en de ene hand wordt eerder verwijdert dan de ander.
    /*for(list<Card*>::iterator it=cards.begin();it!=cards.end();it++){
        delete *it;
    }*/
    cards.clear();
}